flowchart BT
  RequiredToBeUniform ==> workgroupBarriercall;
  RequiredToBeUniform -.-> storageBarriercall;
  CFreturn -.-> CFstart;
  aidentexpr ==> MayBeNonUniform;
  xlvalue ==> aidentexpr;
  xidentexpr -.-> CFstart;
  xidentexpr ==> xlvalue;
  binaryexprresult ==> xidentexpr;
  binaryexprresult -.-> CFstart;
  ifstmt ==> binaryexprresult;
  workgroupBarriercall ==> ifstmt;
  CFafterworkgroupBarrier -.-> workgroupBarriercall;
  bidentexpr -.-> CFstart;
  xlvalue1 -.-> bidentexpr;
  xidentexpr1 -.-> CFstart;
  xidentexpr1 -.-> xlvalue1;
  binaryexprresult1 -.-> xidentexpr1;
  binaryexprresult1 -.-> CFstart;
  ifstmt1 -.-> binaryexprresult1;
  storageBarriercall -.-> ifstmt1;
  CFafterstorageBarrier -.-> storageBarriercall;

  style MayBeNonUniform fill:#941b1b
  style RequiredToBeUniform fill:#1818ab
  linkStyle 0,3,4,6,7,9,10 stroke:#941b1b

  subgraph if1 [if x > 0]
    xidentexpr[var_ident_expr: x];
    binaryexprresult[binary_expr: x > 0];
    ifstmt([if_stmt: x > 0]);
    workgroupBarriercall([call: workgroupBarrier]);
    CFafterworkgroupBarrier([CF_after_workgroupBarrier]);
  end
  subgraph if2 [if x < 0]
    xidentexpr1[var_ident_expr: x];
    binaryexprresult1[binary_expr: x < 0];
    ifstmt1([if_stmt: x < 0]);
    storageBarriercall([call: storageBarrier]);
    CFafterstorageBarrier([CF_after_storageBarrier]);
  end
  CFstart([CF_start]);
  CFreturn([CF_return]);
  aidentexpr[var_ident_expr: a];
  bidentexpr[var_ident_expr: b];
  xlvalue[lvalue: x];
  xlvalue1[lvalue: x];
